package com.learn.multi_thread.A_BaseThread.C_ReentrantLock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TicketThreadForThreadAboutLock extends Thread {
//    int ticket = 0;  出现多个窗口卖同一张票的问题
// 任然会有少量出现多个窗口卖同一张票的问题，且有超卖的问题
    static int ticket = 0;

//    Lock lock = new ReentrantLock(); // 由于是extends实现的锁因此需要标识为静态
// 由于是extends实现的锁因此需要标识为静态
    static Lock lock = new ReentrantLock();

    /**
     *  同步代码块注意点
     *  1. 同步代码块不能在while循环外，否则同步代码块失效的问题，否则会出现单个线程把所有的票卖完的问题
     *  2. 锁对象必须唯一，否侧失去了同步代码块的作用
     */
    @Override
    public void run() {
        while (true) {
            lock.lock();
//            synchronized (lockObject) {
            try {
                if (ticket == 100) {
                    break;
                } else {
                    Thread.sleep(100);
                    System.out.println(
                            Thread.currentThread().getName() + "正在卖第" + (++ticket) + "张票"
                    );
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
//            }
//            lock.unlock();  // 若在此处写的话会导致只有一个线程在卖票
        }
    }
}
